From: Keir Fraser Date: Wed, 24 Feb 2010 10:59:37 +0000 (+0000) Subject: vtd: interrupt remapping: be more defensive X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12568 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=1afe671e3aa7de913ac93152864f0b524ec291f6;p=xen.git vtd: interrupt remapping: be more defensive 1) A buggy BIOS may not report IOAPIC in DRHD. Currently we still try to enable IR while the IOAPIC RTEs are still in non-remappable format and the host would hang. The patch detects this case and will not try to enable IR. 2) Currently HPET's MSI mode doesn't work if IR is enabled because we have no code to allocate IRTE for it. Luckily this HW configuration is rather rarely at present, we can just work it around by only using HPET's IOAPIC mode for now. Signed-off-by: Dexuan Cui --- diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 556d1ee10d..c330a3c82f 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -380,6 +380,14 @@ static int hpet_fsb_cap_lookup(void) unsigned int num_chs, num_chs_used; int i; + /* TODO. */ + if ( iommu_intremap ) + { + printk(XENLOG_INFO "HPET's MSI mode hasn't been supported when " + "Interrupt Remapping is enabled.\n"); + return 0; + } + id = hpet_read32(HPET_ID); num_chs = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index bf325a8d5f..fd77b014ba 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1825,6 +1825,23 @@ static int init_vtd_hw(void) } } + if ( iommu_intremap ) + { + int apic; + for ( apic = 0; apic < nr_ioapics; apic++ ) + { + if ( ioapic_to_iommu(IO_APIC_ID(apic)) == NULL ) + { + iommu_intremap = 0; + dprintk(XENLOG_ERR VTDPREFIX, + "ioapic_to_iommu: ioapic 0x%x (id: 0x%x) is NULL! " + "Will not try to enable Interrupt Remapping.\n", + apic, IO_APIC_ID(apic)); + break; + } + } + } + if ( iommu_intremap ) { for_each_drhd_unit ( drhd )